package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /**
     * 员工登录
     * @param session 登录账号的id
     * @param employee 页面登录的信息(账号和密码)
     * @return
     */
       @PostMapping("/login")
       public R login (HttpSession session, @RequestBody Employee employee){
           R r = employeeService.login(employee);
           if (r.getCode() == 1) {
               // 登录成功, 记住登录状态
               // 因为这里没有从数据库查询的数据,数据从data中获取，但必须要强转为Employee才能调用getId方法
               Employee emp =(Employee)r.getData();
               session.setAttribute("employee",emp.getId());
           }
           return r;
       }

    /**
     * 退出登录
     * @param session 当前登录的id
     * @return
     */
    @PostMapping("/logout")
        // 销毁session
    public R logout(HttpSession session){
        session.invalidate();
    return  R.success();
    }

    /**
     * 添加员工
     * @param session 当前登录的账号的id
     * @param employee //前端传递要添加的数据
     * @return
     */
    @PostMapping
    public  R save(HttpSession session,@RequestBody Employee employee){
        // 设置初始密码 单纯MD5加密不可靠,容易被暴力破解, 后期记得加盐
employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        //设置创建时间和修改时间(留痕)
//        employee.setCreateTime(LocalDateTime.now());
//        employee.setUpdateTime(LocalDateTime.now());
        //设置创建人和修改人
//        Long empId = (Long) session.getAttribute("employee");
//        employee.setCreateUser(empId);
//        employee.setUpdateUser(empId);
        //完成添加数据的操作
       employeeService.save(employee);
       return R.success("添加成功");
    }

    /**
     * 分页查询条件
     * @param page 当前页码
     * @param pageSize 每页显示条数
     * @param name 模糊查询条件
     * @return 查询结果
     */
    @GetMapping("/page")
    public  R page(Integer page,Integer pageSize,String name){
    IPage<Employee> p=employeeService.getPageByName( page, pageSize, name);
        return R.success(p);
    }



    /**
     * 根据id修改员工信息
     * @param employee
     * @return
     */
    /*
    * 在修改操作出现问题后，我们研究了数据传递的整的过程，最后发现前端的ID和数据库中的ID对应不上，
    * 原因就是:java中存储ID使用的是Long类型，超出前端取值范围,丢失了精度
    * 解决方案: 将响应给前端的ID类型转换为String在响应，这样就不会丢失精度了
    * */
    @PutMapping
    public R update(HttpSession session,@RequestBody Employee employee){
        //获取当前登录的id
        Long empId = (Long) session.getAttribute("employee");
        //设置修改的人和修改的时间
//       employee.setUpdateUser(empId);
//       employee.setUpdateTime(LocalDateTime.now());

       //调用service完成修改操作
        employeeService.updateById(employee);
    return R.success("修改成功");
    }

    /**
     * 修改数据，先回显 由于于上面的修改代码是兼容的 所以不用再写了
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public R getById(@PathVariable Long id){
        Employee emp = employeeService.getById(id);
        return R.success(emp);
}
}

/*

前端传递参数的方式:

1. json:
        login(@RequestBody Employee employee)
2. url?ujson:sername=zhangsan
        login(String username)
        login(User user)
3. localhost/emp/1
        @GetMapping("/{id}")
        login(@PathVariable Integer id)
   */
